﻿using BLevy.Entidad;
using BLevy.Negocio;
using Microsoft.Reporting.WinForms;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BLevy.UI
{
    public partial class frmSociosReporte : Form
    {
        private string operacion;
        private int? localidad_id;
        private int? zona_id;
        private string orden;
        private int? activo;
        private List<Zona> zona_ids;
        private int? cuota;
        private bool? direcciones;
        private bool? cuotas;

        public frmSociosReporte(string _operacion, int? _localidad_id, int? _zona_id, string _orden, int? _activo, List<Zona> _zona_ids, int? _cuota, bool? _direcciones, bool? _cuotas)
        {
            InitializeComponent();

            operacion = _operacion;
            localidad_id = _localidad_id;
            zona_id = _zona_id;
            orden = _orden;
            activo = _activo;
            zona_ids = _zona_ids;
            cuota = _cuota;
            cuotas = _cuotas;
            direcciones = _direcciones;
        }


        private void frmSociosReporte_Load(object sender, EventArgs e)
        {
            var query_ordenada = (IList<Socio>)null;
            var query_socios_ordenada = (IList<Socio>)null;

            IEnumerable<Socio> sociosL;

            //si es reporte de grupos y titulares
            if (operacion == "GrupoTitular")
            {
                try
                {
                    //traigo los datos si tengo zonas en el filtro
                    if (zona_ids.Count != 0)
                    {

                        sociosL = Negocio.Socios.FindAllConAdherentesZona(activo)
                            .Where(item => zona_ids.Any(z => z.id == item.zona_id));
                    }
                    else // traigo los datos sin las zonas en el filtro
                    {
                        sociosL = Negocio.Socios.FindAllConAdherentesZona(activo);
                    }

                    //lo ordeno segun la seleccion
                    if (orden == "Numerico")
                    {
                        query_ordenada = sociosL.OrderBy(x => x.numero_certificado).ToList();
                    }

                    if (orden == "Alfabetico")
                    {
                        query_ordenada = sociosL.OrderBy(x => x.apellido).ToList();
                    }

                    int count_socios = sociosL.ToList().Count;

                    var total_adherentes = from row in sociosL
                                           .SelectMany(x => x.adherentes)
                                           select row;

                    int count_adherentes = total_adherentes.ToList().Count();


                    ReportParameter p = new ReportParameter("count_socios", count_socios.ToString());
                    ReportParameter p1 = new ReportParameter("count_adherentes", count_adherentes.ToString());
                    ReportParameter p2 = new ReportParameter("direcciones", direcciones.ToString());
                    ReportParameter p3 = new ReportParameter("cuotas", cuotas.ToString());

                    if (cuota != null)
                    {
                        //armo los campos del reporte
                        var query = (from fila in query_ordenada
                                     select new
                                     {
                                         ID = fila.id,
                                         NUMERO_CERTIFICADO = fila.numero_certificado,
                                         APELLIDO = fila.apellido,
                                         NOMBRES = fila.nombres,
                                         DOCUMENTO = fila.documento,
                                         FECHA_NACIMIENTO = fila.fecha_nacimiento,
                                         FECHA_INGRESO = fila.fecha_ingreso,
                                         ACTIVO = fila.activo,
                                         APELLIDO1 = fila.apellido,
                                         NOMBRES1 = fila.nombres,
                                         DOCUMENTO1 = fila.documento,
                                         FECHA_NACIMIENTO1 = fila.fecha_nacimiento,
                                         FECHA_INGRESO1 = fila.fecha_ingreso,
                                         ZONA = fila.zona.zona,
                                         DIRECCION = fila.direccion,
                                         DIRECCION1 = fila.direccion,
                                         CUOTA = PeriodosSocios.CalcularCuota(fila)

                                     }).ToList();


                        ReportDataSource rds = new ReportDataSource();
                        rds = new ReportDataSource("DataSet1", query.OrderBy(x => x.APELLIDO));

                        this.reportViewer1.LocalReport.ReportEmbeddedResource = "BLevy.UI.Reportes.ReporteSociosGrupoTitular.rdlc";
                        this.reportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(SubReportGetAdherentes);
                        this.reportViewer1.LocalReport.SetParameters(new ReportParameter[] { p, p1, p2, p3 });
                        this.reportViewer1.LocalReport.DataSources.Add(rds);
                        this.reportViewer1.RefreshReport();
                    }
                    else
                    {
                        var query = (from fila in query_ordenada
                                     select new
                                     {
                                         ID = fila.id,
                                         NUMERO_CERTIFICADO = fila.numero_certificado,
                                         APELLIDO = fila.apellido,
                                         NOMBRES = fila.nombres,
                                         DOCUMENTO = fila.documento,
                                         FECHA_NACIMIENTO = fila.fecha_nacimiento,
                                         FECHA_INGRESO = fila.fecha_ingreso,
                                         ACTIVO = fila.activo,
                                         APELLIDO1 = fila.apellido,
                                         NOMBRES1 = fila.nombres,
                                         DOCUMENTO1 = fila.documento,
                                         FECHA_NACIMIENTO1 = fila.fecha_nacimiento,
                                         FECHA_INGRESO1 = fila.fecha_ingreso,
                                         ZONA = fila.zona.zona,
                                         DIRECCION = fila.direccion,
                                         DIRECCION1 = fila.direccion
                                         //CUOTA = PeriodosSocios.CalcularCuota(fila)

                                     }).ToList();


                        ReportDataSource rds = new ReportDataSource();
                        rds = new ReportDataSource("DataSet1", query);

                        this.reportViewer1.LocalReport.ReportEmbeddedResource = "BLevy.UI.Reportes.ReporteSociosGrupoTitular.rdlc";
                        this.reportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(SubReportGetAdherentes);
                        this.reportViewer1.LocalReport.SetParameters(new ReportParameter[] { p, p1, p2, p3 });
                        this.reportViewer1.LocalReport.DataSources.Add(rds);
                        this.reportViewer1.RefreshReport();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else // si es reporte de titulares solos
            {
                try
                {
                    if (zona_ids.Count != 0)
                    {
                        sociosL = Negocio.Socios.FindAllConAdherentesZona(activo)
                            .Where(item => zona_ids.Any(z => z.id == item.zona_id));
                    }
                    else // traigo los datos sin las zonas en el filtro
                    {
                        sociosL = Negocio.Socios.FindAllConAdherentesZona(activo);
                    }

                    //lo ordeno segun la seleccion
                    if (orden == "Numerico")
                    {
                        query_socios_ordenada = sociosL.OrderBy(x => x.numero_certificado).ToList();
                    }

                    if (orden == "Alfabetico")
                    {
                        query_socios_ordenada = sociosL.OrderBy(x => x.apellido).ToList();
                    }

                    int count_socios = sociosL.ToList().Count();


                    ReportParameter p = new ReportParameter("count_socios", count_socios.ToString());
                    ReportParameter p1 = new ReportParameter("count_adherentes", "0");
                    ReportParameter p2 = new ReportParameter("direcciones", direcciones.ToString());
                    ReportParameter p3 = new ReportParameter("cuotas", cuotas.ToString());

                    if (cuota != null)
                    {
                        //armo los campos del reporte
                        var query = (from fila in query_socios_ordenada
                                     join localidad in Localidades.FindAll() on fila.localidad_id equals localidad.id
                                     join zona in Negocio.Zonas.FindAll() on fila.zona_id equals zona.id
                                     select new
                                     {
                                         ID = fila.id,
                                         NUMERO_CERTIFICADO = fila.numero_certificado,
                                         APELLIDO = fila.apellido,
                                         NOMBRES = fila.nombres,
                                         DOCUMENTO = fila.documento,
                                         FECHA_NACIMIENTO = fila.fecha_nacimiento,
                                         FECHA_INGRESO = fila.fecha_ingreso,
                                         ACTIVO = fila.activo,
                                         LOCALIDAD = localidad.localidad,
                                         ZONA = zona.zona,
                                         DIRECCION = fila.direccion,
                                         CUOTA = PeriodosSocios.CalcularCuota(fila)

                                     }).ToList();

                        if (orden == "Alfabetico")
                            query = query.OrderBy(x => x.APELLIDO).ToList();
                        else
                            query = query.OrderBy(x => x.NUMERO_CERTIFICADO).ToList();


                        ReportDataSource rds = new ReportDataSource();
                        rds = new ReportDataSource("DataSet1", query);

                        this.reportViewer1.LocalReport.ReportEmbeddedResource = "BLevy.UI.Reportes.ReporteSociosTitulares.rdlc";
                        this.reportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(SubReportGetAdherentes);
                        this.reportViewer1.LocalReport.SetParameters(new ReportParameter[] { p, p1, p2, p3 });
                        this.reportViewer1.LocalReport.DataSources.Add(rds);
                        this.reportViewer1.RefreshReport();

                    }

                    else
                    {
                        //armo los campos del reporte
                        var query = (from fila in query_socios_ordenada
                                     join localidad in Localidades.FindAll() on fila.localidad_id equals localidad.id
                                     join zona in Negocio.Zonas.FindAll() on fila.zona_id equals zona.id
                                     select new
                                     {
                                         ID = fila.id,
                                         NUMERO_CERTIFICADO = fila.numero_certificado,
                                         APELLIDO = fila.apellido,
                                         NOMBRES = fila.nombres,
                                         DOCUMENTO = fila.documento,
                                         FECHA_NACIMIENTO = fila.fecha_nacimiento,
                                         FECHA_INGRESO = fila.fecha_ingreso,
                                         ACTIVO = fila.activo,
                                         LOCALIDAD = localidad.localidad,
                                         ZONA = zona.zona,
                                         DIRECCION = fila.direccion

                                     }).ToList();

                        ReportDataSource rds = new ReportDataSource();
                        rds = new ReportDataSource("DataSet1", query);

                        this.reportViewer1.LocalReport.ReportEmbeddedResource = "BLevy.UI.Reportes.ReporteSociosTitulares.rdlc";
                        this.reportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(SubReportGetAdherentes);
                        this.reportViewer1.LocalReport.SetParameters(new ReportParameter[] { p, p1, p2, p3 });
                        this.reportViewer1.LocalReport.DataSources.Add(rds);
                        this.reportViewer1.RefreshReport();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

        }


        void SubReportGetAdherentes(object sender, SubreportProcessingEventArgs e)
        {
            try
            { 
            int socio_id = int.Parse(e.Parameters["SOCIO_ID"].Values[0].ToString());
            ReportDataSource rds = new ReportDataSource("adherentes", GetAdherentesPorSocioId(socio_id));
            e.DataSources.Add(rds);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error : " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private IList<Adherente> GetAdherentesPorSocioId(int socio_id)
        {
            IList<Adherente> adherentesL = null;

            try
            {
                adherentesL = Adherentes.FindByIdSocio(socio_id);               
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            return adherentesL;
        }
    }
}
